<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Part01.多进程和多线程服务器 | whoway</title>
    <meta name="description" content="Personal Blog Website">
    <link rel="icon" href="/images/photo.jpg">
  <link rel="manifest" href="/images/photo.jpg">
  <link rel="apple-touch-icon" href="/images/photo.jpg">
  <meta http-quiv="pragma" cotent="no-cache">
  <meta http-quiv="pragma" cotent="no-cache,must-revalidate">
  <meta http-quiv="expires" cotent="0">
    
    <link rel="preload" href="/assets/css/0.styles.0dbae9ec.css" as="style"><link rel="preload" href="/assets/js/app.c70e21ad.js" as="script"><link rel="preload" href="/assets/js/81.02670d10.js" as="script"><link rel="prefetch" href="/assets/js/10.15222a53.js"><link rel="prefetch" href="/assets/js/100.7e0e5a86.js"><link rel="prefetch" href="/assets/js/101.efd59f25.js"><link rel="prefetch" href="/assets/js/102.dfbdc06c.js"><link rel="prefetch" href="/assets/js/103.d3ab2109.js"><link rel="prefetch" href="/assets/js/104.117957ef.js"><link rel="prefetch" href="/assets/js/105.046e8ff3.js"><link rel="prefetch" href="/assets/js/106.aebdc17d.js"><link rel="prefetch" href="/assets/js/107.248733c2.js"><link rel="prefetch" href="/assets/js/108.a2fecadc.js"><link rel="prefetch" href="/assets/js/109.35196857.js"><link rel="prefetch" href="/assets/js/11.770642f2.js"><link rel="prefetch" href="/assets/js/110.cf3d973c.js"><link rel="prefetch" href="/assets/js/111.f985889a.js"><link rel="prefetch" href="/assets/js/112.ad614f41.js"><link rel="prefetch" href="/assets/js/113.f666653c.js"><link rel="prefetch" href="/assets/js/114.c6c3f384.js"><link rel="prefetch" href="/assets/js/115.e51d3c2f.js"><link rel="prefetch" href="/assets/js/116.4f4b39f5.js"><link rel="prefetch" href="/assets/js/117.99352e11.js"><link rel="prefetch" href="/assets/js/118.c6ae6572.js"><link rel="prefetch" href="/assets/js/119.4ccbe778.js"><link rel="prefetch" href="/assets/js/12.042a92ff.js"><link rel="prefetch" href="/assets/js/120.edda1c4f.js"><link rel="prefetch" href="/assets/js/121.30a638ed.js"><link rel="prefetch" href="/assets/js/122.6efcefb1.js"><link rel="prefetch" href="/assets/js/123.91e6665b.js"><link rel="prefetch" href="/assets/js/124.f27e3d7e.js"><link rel="prefetch" href="/assets/js/125.c75712d5.js"><link rel="prefetch" href="/assets/js/126.ed756cce.js"><link rel="prefetch" href="/assets/js/127.2f06c74c.js"><link rel="prefetch" href="/assets/js/128.d5f6f30e.js"><link rel="prefetch" href="/assets/js/129.508b7eed.js"><link rel="prefetch" href="/assets/js/13.b5280c37.js"><link rel="prefetch" href="/assets/js/130.dc05f9aa.js"><link rel="prefetch" href="/assets/js/131.e0ba69b1.js"><link rel="prefetch" href="/assets/js/132.d79bcaa4.js"><link rel="prefetch" href="/assets/js/133.34acc01a.js"><link rel="prefetch" href="/assets/js/134.dabf64d5.js"><link rel="prefetch" href="/assets/js/135.ad90c915.js"><link rel="prefetch" href="/assets/js/136.dbb0074f.js"><link rel="prefetch" href="/assets/js/137.284ad365.js"><link rel="prefetch" href="/assets/js/138.a4b6856f.js"><link rel="prefetch" href="/assets/js/139.c9c1e20f.js"><link rel="prefetch" href="/assets/js/14.df02ba38.js"><link rel="prefetch" href="/assets/js/140.8b0a9269.js"><link rel="prefetch" href="/assets/js/141.9c7759c5.js"><link rel="prefetch" href="/assets/js/142.a4201a82.js"><link rel="prefetch" href="/assets/js/143.d7da6e8c.js"><link rel="prefetch" href="/assets/js/144.5e48e65d.js"><link rel="prefetch" href="/assets/js/145.a0e2633c.js"><link rel="prefetch" href="/assets/js/146.3c775f9b.js"><link rel="prefetch" href="/assets/js/147.22add89a.js"><link rel="prefetch" href="/assets/js/148.cfde1009.js"><link rel="prefetch" href="/assets/js/149.ffc835b5.js"><link rel="prefetch" href="/assets/js/15.fbdfc4ee.js"><link rel="prefetch" href="/assets/js/150.406c4b20.js"><link rel="prefetch" href="/assets/js/151.b2040eea.js"><link rel="prefetch" href="/assets/js/152.7bc65661.js"><link rel="prefetch" href="/assets/js/153.1d7c65e3.js"><link rel="prefetch" href="/assets/js/154.1309de49.js"><link rel="prefetch" href="/assets/js/155.81d3ee1f.js"><link rel="prefetch" href="/assets/js/156.154a4ef2.js"><link rel="prefetch" href="/assets/js/16.e5eb6147.js"><link rel="prefetch" href="/assets/js/17.57853c4a.js"><link rel="prefetch" href="/assets/js/18.cb9d7518.js"><link rel="prefetch" href="/assets/js/19.f354dc47.js"><link rel="prefetch" href="/assets/js/2.570d8a23.js"><link rel="prefetch" href="/assets/js/20.b5af7fad.js"><link rel="prefetch" href="/assets/js/21.0b1928fe.js"><link rel="prefetch" href="/assets/js/22.f78666de.js"><link rel="prefetch" href="/assets/js/23.29c3f366.js"><link rel="prefetch" href="/assets/js/24.6f596516.js"><link rel="prefetch" href="/assets/js/25.14067b60.js"><link rel="prefetch" href="/assets/js/26.74ba4989.js"><link rel="prefetch" href="/assets/js/27.13d60edd.js"><link rel="prefetch" href="/assets/js/28.9523cb32.js"><link rel="prefetch" href="/assets/js/29.8ec842e9.js"><link rel="prefetch" href="/assets/js/3.3fb3d2e0.js"><link rel="prefetch" href="/assets/js/30.805597a8.js"><link rel="prefetch" href="/assets/js/31.831b195d.js"><link rel="prefetch" href="/assets/js/32.063c672d.js"><link rel="prefetch" href="/assets/js/33.6d93fac3.js"><link rel="prefetch" href="/assets/js/34.56e8263c.js"><link rel="prefetch" href="/assets/js/35.dbe688bb.js"><link rel="prefetch" href="/assets/js/36.dc5af2c1.js"><link rel="prefetch" href="/assets/js/37.0a7494f6.js"><link rel="prefetch" href="/assets/js/38.fe4fc171.js"><link rel="prefetch" href="/assets/js/39.f5ed5e92.js"><link rel="prefetch" href="/assets/js/4.2c405ec8.js"><link rel="prefetch" href="/assets/js/40.fe7e2714.js"><link rel="prefetch" href="/assets/js/41.30b0811d.js"><link rel="prefetch" href="/assets/js/42.76f52d62.js"><link rel="prefetch" href="/assets/js/43.e7bb0817.js"><link rel="prefetch" href="/assets/js/44.ead0e883.js"><link rel="prefetch" href="/assets/js/45.235df046.js"><link rel="prefetch" href="/assets/js/46.5f09e829.js"><link rel="prefetch" href="/assets/js/47.67116354.js"><link rel="prefetch" href="/assets/js/48.31f34543.js"><link rel="prefetch" href="/assets/js/49.10b5ebba.js"><link rel="prefetch" href="/assets/js/5.6f47322c.js"><link rel="prefetch" href="/assets/js/50.c0f0b7f1.js"><link rel="prefetch" href="/assets/js/51.5143f3bf.js"><link rel="prefetch" href="/assets/js/52.eeddfd48.js"><link rel="prefetch" href="/assets/js/53.eb790db5.js"><link rel="prefetch" href="/assets/js/54.8fe5421c.js"><link rel="prefetch" href="/assets/js/55.d8f9004b.js"><link rel="prefetch" href="/assets/js/56.62ac9b92.js"><link rel="prefetch" href="/assets/js/57.a9caec0d.js"><link rel="prefetch" href="/assets/js/58.f93fc522.js"><link rel="prefetch" href="/assets/js/59.a81a03aa.js"><link rel="prefetch" href="/assets/js/6.8c2ea393.js"><link rel="prefetch" href="/assets/js/60.ab782775.js"><link rel="prefetch" href="/assets/js/61.6dd12daf.js"><link rel="prefetch" href="/assets/js/62.76f4b01f.js"><link rel="prefetch" href="/assets/js/63.6f8a4742.js"><link rel="prefetch" href="/assets/js/64.6f8bb1fa.js"><link rel="prefetch" href="/assets/js/65.4120a44b.js"><link rel="prefetch" href="/assets/js/66.360c2d2b.js"><link rel="prefetch" href="/assets/js/67.26f84d32.js"><link rel="prefetch" href="/assets/js/68.68f45e5e.js"><link rel="prefetch" href="/assets/js/69.e311eb56.js"><link rel="prefetch" href="/assets/js/7.6762b2d7.js"><link rel="prefetch" href="/assets/js/70.cea82674.js"><link rel="prefetch" href="/assets/js/71.783ddcf7.js"><link rel="prefetch" href="/assets/js/72.e5467385.js"><link rel="prefetch" href="/assets/js/73.b8fb681b.js"><link rel="prefetch" href="/assets/js/74.1bae37db.js"><link rel="prefetch" href="/assets/js/75.024387e5.js"><link rel="prefetch" href="/assets/js/76.a8e53010.js"><link rel="prefetch" href="/assets/js/77.8c55500a.js"><link rel="prefetch" href="/assets/js/78.7ce90bf5.js"><link rel="prefetch" href="/assets/js/79.ef71713f.js"><link rel="prefetch" href="/assets/js/8.788a6364.js"><link rel="prefetch" href="/assets/js/80.acad589d.js"><link rel="prefetch" href="/assets/js/82.53b7b1ac.js"><link rel="prefetch" href="/assets/js/83.99eb8581.js"><link rel="prefetch" href="/assets/js/84.d1535ce3.js"><link rel="prefetch" href="/assets/js/85.fe2b7de9.js"><link rel="prefetch" href="/assets/js/86.41850272.js"><link rel="prefetch" href="/assets/js/87.1cdc6df9.js"><link rel="prefetch" href="/assets/js/88.01bf3461.js"><link rel="prefetch" href="/assets/js/89.17c69819.js"><link rel="prefetch" href="/assets/js/9.3813842d.js"><link rel="prefetch" href="/assets/js/90.f6ae7e35.js"><link rel="prefetch" href="/assets/js/91.507bc284.js"><link rel="prefetch" href="/assets/js/92.90551782.js"><link rel="prefetch" href="/assets/js/93.dc442d78.js"><link rel="prefetch" href="/assets/js/94.315f4e94.js"><link rel="prefetch" href="/assets/js/95.ccd6c6bf.js"><link rel="prefetch" href="/assets/js/96.0c6d89d0.js"><link rel="prefetch" href="/assets/js/97.1a9f10a9.js"><link rel="prefetch" href="/assets/js/98.43be3caa.js"><link rel="prefetch" href="/assets/js/99.54c8207b.js">
    <link rel="stylesheet" href="/assets/css/0.styles.0dbae9ec.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">whoway</span></a> <div class="links" style="max-width:nullpx;"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">🎓Coding</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/00.Coding/TheBeautyOfProgramming/" class="nav-link">🔖编程之美题解</a></li><li class="dropdown-item"><!----> <a href="/00.Coding/CodeWarehouse/" class="nav-link">🔖代码意识流</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">🚀语言</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/01.Language/Overview/" class="nav-link">🔖概述</a></li><li class="dropdown-item"><!----> <a href="/01.Language/C/" class="nav-link">⭐️C</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Cpp/" class="nav-link">🚀C++</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Java/" class="nav-link">☕️Java</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Python/" class="nav-link">🧩Python3</a></li></ul></div></div><div class="nav-item"><a href="/02.Hardware/" class="nav-link">✔️硬件基础</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">⭐️软件基础</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/03.Software/01.DataStructureAndAlgorithm/" class="nav-link">🐾数据结构和算法</a></li><li class="dropdown-item"><!----> <a href="/03.Software/02.OS/" class="nav-link">💻操作系统</a></li><li class="dropdown-item"><!----> <a href="/03.Software/03.Net/" class="nav-link router-link-active">☁️计算机网络</a></li><li class="dropdown-item"><!----> <a href="/03.Software/04.SE/" class="nav-link">✅软件工程</a></li></ul></div></div><div class="nav-item"><a href="/04.Database/" class="nav-link">🎨数据库</a></div><div class="nav-item"><a href="/05.Engineer/" class="nav-link">🔖学术/工程</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">⚙️工具</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/06.Tools/01.employment/" class="nav-link">🔖求职</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/02.efficiency/" class="nav-link">🚀效能</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/03.windows/" class="nav-link">⚙️Windows</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/04.design/" class="nav-link">🧩设计</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/05.linux/" class="nav-link">🐉Linux</a></li></ul></div></div><div class="nav-item"><a href="https://github.com/whoway" target="_blank" rel="noopener noreferrer" class="nav-link external">
  GitHub
  <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <div class="sidebar"><nav class="nav-links"><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">🎓Coding</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/00.Coding/TheBeautyOfProgramming/" class="nav-link">🔖编程之美题解</a></li><li class="dropdown-item"><!----> <a href="/00.Coding/CodeWarehouse/" class="nav-link">🔖代码意识流</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">🚀语言</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/01.Language/Overview/" class="nav-link">🔖概述</a></li><li class="dropdown-item"><!----> <a href="/01.Language/C/" class="nav-link">⭐️C</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Cpp/" class="nav-link">🚀C++</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Java/" class="nav-link">☕️Java</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Python/" class="nav-link">🧩Python3</a></li></ul></div></div><div class="nav-item"><a href="/02.Hardware/" class="nav-link">✔️硬件基础</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">⭐️软件基础</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/03.Software/01.DataStructureAndAlgorithm/" class="nav-link">🐾数据结构和算法</a></li><li class="dropdown-item"><!----> <a href="/03.Software/02.OS/" class="nav-link">💻操作系统</a></li><li class="dropdown-item"><!----> <a href="/03.Software/03.Net/" class="nav-link router-link-active">☁️计算机网络</a></li><li class="dropdown-item"><!----> <a href="/03.Software/04.SE/" class="nav-link">✅软件工程</a></li></ul></div></div><div class="nav-item"><a href="/04.Database/" class="nav-link">🎨数据库</a></div><div class="nav-item"><a href="/05.Engineer/" class="nav-link">🔖学术/工程</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">⚙️工具</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/06.Tools/01.employment/" class="nav-link">🔖求职</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/02.efficiency/" class="nav-link">🚀效能</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/03.windows/" class="nav-link">⚙️Windows</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/04.design/" class="nav-link">🧩设计</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/05.linux/" class="nav-link">🐉Linux</a></li></ul></div></div><div class="nav-item"><a href="https://github.com/whoway" target="_blank" rel="noopener noreferrer" class="nav-link external">
  GitHub
  <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <!----></nav>  <ul class="sidebar-links"><li><div class="sidebar-group first"><p class="sidebar-heading open"><span>Part01.多进程和多线程服务器</span> <!----></p> <ul class="sidebar-group-items"><li><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_1-多线程服务器" class="sidebar-link">1.多线程服务器</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_1-1-pthread线程库和c-11线程库" class="sidebar-link">1.1.pthread线程库和C++11线程库</a></li><li class="sidebar-sub-header"><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_1-2-tcp在网络编程当中的地位" class="sidebar-link">1.2.TCP在网络编程当中的地位</a></li></ul></li><li><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_2-tcp状态转换『重要』⭐" class="sidebar-link">2.TCP状态转换『重要』⭐</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_2-1-『2msl』-maximum-segment-lifetime" class="sidebar-link">2.1.『2MSL』 (Maximum Segment Lifetime)</a></li><li class="sidebar-sub-header"><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_2-2-半关闭" class="sidebar-link">2.2.半关闭</a></li></ul></li><li><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_3-网络套接字相关函数『记忆』" class="sidebar-link">3.网络套接字相关函数『记忆』</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_3-1-字节序和主机字节序的转换" class="sidebar-link">3.1.字节序和主机字节序的转换</a></li><li class="sidebar-sub-header"><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_3-3-sockaddr数据结构" class="sidebar-link">3.3.sockaddr数据结构</a></li></ul></li><li><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_4-tcp的两份代码（要倒背如流）" class="sidebar-link">4.TCP的两份代码（要倒背如流）</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_4-1-只写了服务器端，如何测试？nc" class="sidebar-link">4.1.只写了服务器端，如何测试？nc</a></li></ul></li><li><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_4-错误处理函数" class="sidebar-link">4.错误处理函数</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_5-『tcp3次握手和4次挥手』" class="sidebar-link">5.『TCP3次握手和4次挥手』</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_2-4次挥手（原因）" class="sidebar-link">2.4次挥手（原因）</a></li><li class="sidebar-sub-header"><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_3mtu（最大传输单元）" class="sidebar-link">3MTU（最大传输单元）</a></li><li class="sidebar-sub-header"><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_4滑动窗口" class="sidebar-link">4滑动窗口</a></li></ul></li><li><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#_6-总结" class="sidebar-link">6.总结</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/03.Software/03.Net/Part01.%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.html#参考资料" class="sidebar-link">参考资料</a><ul class="sidebar-sub-headers"></ul></li></ul></div></li></ul> </div> <div class="page"> <div class="content"><h1 id="part01-多进程和多线程服务器"><a href="#part01-多进程和多线程服务器" class="header-anchor">#</a> Part01.多进程和多线程服务器</h1> <h2 id="_1-多线程服务器"><a href="#_1-多线程服务器" class="header-anchor">#</a> 1.多线程服务器</h2> <h3 id="_1-1-pthread线程库和c-11线程库"><a href="#_1-1-pthread线程库和c-11线程库" class="header-anchor">#</a> 1.1.pthread线程库和C++11线程库</h3> <blockquote><p>参考：<a href="https://developer.aliyun.com/article/383405" target="_blank" rel="noopener noreferrer">阿里云<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></p></blockquote> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&lt;pthread.h&gt;</span></span>
Linux下<span class="token string">&quot;undefined reference to ‘pthread_create’&quot;</span>問題解決
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><ul><li>解决方案</li></ul> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code>pthread 库不是 Linux 系统默认的库，连接时需要使用静态库libpthread<span class="token punctuation">.</span>a，所以在使用<span class="token function">pthread_create</span><span class="token punctuation">(</span><span class="token punctuation">)</span>创建线程，以及调用 <span class="token function">pthread_atfork</span><span class="token punctuation">(</span><span class="token punctuation">)</span>函数建立fork处理程序时，需要链接该库。
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><ul><li>编译的时候加上<code>-lpthread</code></li></ul> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>g++ glb_var_pthrd.c -lpthread
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h3 id="_1-2-tcp在网络编程当中的地位"><a href="#_1-2-tcp在网络编程当中的地位" class="header-anchor">#</a> 1.2.TCP在网络编程当中的地位</h3> <ul><li>TCP在网络编程当中的地位，相当于你吃饭过程当中，筷子的地位</li> <li>MTU、mss、半关闭（这是我们在TCP3次握手中，分支的一些细小的知识）</li></ul> <p><font style="background:yellow;">Windows和Linux下的netstat命令的配合复习</font></p> <h2 id="_2-tcp状态转换『重要』⭐"><a href="#_2-tcp状态转换『重要』⭐" class="header-anchor">#</a> 2.TCP状态转换『重要』⭐</h2> <ul><li><p>03.『TCP状态转换记忆TCP状态转换图『记忆』</p></li> <li><p>Windows下可以用命令查看这些状态</p></li></ul> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token function">netstat</span> -a
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>Linux下，我们测试，服务器的命令（注意，后面的6666是端口号）</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token function">netstat</span> -apn <span class="token operator">|</span> <span class="token function">grep</span> <span class="token number">6666</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><ul><li>这是我们在网络开发过程当中，进行客户端服务器调试的，一个非常重要的依据和手段。我们可以通过我们看到的各种状态，来达到推测出，客户端或服务器当前处于服务器通信的哪个阶段。</li> <li>有这些之后，我们就能知道，当前为什么出现这样的错误</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/status01.png" alt="status01"></p> <ul><li>图大致分3部分
1.实线---主动发起连接，主动关闭连接（C或S都可能）
2.虚线——被动发起/关闭连接
3.小细线——两端同时操作部分。（同时，我们指的是它发送过来，我接收到了）</li></ul> <p>这个图N多人都知道，它排除和定位网络或系统故障时大有帮助，但是怎样牢牢地将这张图刻在脑中呢？那么你就一定要对这张图的每一个状态，及转换的过程有深刻的认识，不能只停留在一知半解之中。下面对这张图的11种状态详细解析一下，以便加强记忆！
C/S通信过程中，每一个阶段和服务器，它所处于的状态。</p> <ul><li><code>CLOSED</code>：表示初始状态。</li> <li><code>LISTEN</code>：该状态表示服务器端的某个SOCKET处于监听状态，可以接受连接。
<code>SYN_SENT</code>：这个状态与SYN_RCVD遥相呼应，当客户端SOCKET执行CONNECT连接时，它首先发送SYN报文，随即进入到了SYN_SENT状态，并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。</li> <li><code>SYN_RCVD</code>: 该状态表示接收到SYN报文，在正常情况下，这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态，很短暂。此种状态时，当收到客户端的ACK报文后，会进入到ESTABLISHED状态。</li> <li><code>ESTABLISHED</code>：（三次握手已经完成）表示连接已经建立。</li> <li><code>FIN_WAIT_1</code>:  FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。区别是：
FIN_WAIT_1状态是当socket在ESTABLISHED状态时，想主动关闭连接，向对方发送了FIN报文，此时该socket进入到FIN_WAIT_1状态。
FIN_WAIT_2状态是当对方回应ACK后，该socket进入到FIN_WAIT_2状态，正常情况下，对方应马上回应ACK报文，所以FIN_WAIT_1状态一般较难见到，而FIN_WAIT_2状态可用netstat看到。</li> <li><code>FIN_WAIT_2</code>：（主动发起关闭的一端。半关闭完成）主动关闭链接的一方，发出FIN收到ACK以后进入该状态。称之为半连接或半关闭状态。该状态下的socket只能接收数据，不能发。</li> <li><code>TIME_WAIT</code>:（主动发起关闭的这端） 表示收到了对方的FIN报文，并发送出了ACK报文，等2MSL（我们使用的Linux下，这个时间大概是1分钟左右，等这个的目的是。我饿不确定对方是否能够收到我发送的ACK）后即可回到CLOSED可用状态。如果FIN_WAIT_1状态下，收到对方同时带 FIN标志和ACK标志的报文时，可以直接进入到TIME_WAIT状态，而无须经过FIN_WAIT_2状态。</li> <li><code>CLOSING</code>: 这种状态较特殊，属于一种较罕见的状态。正常情况下，当你发送FIN报文后，按理来说是应该先收到（或同时收到）对方的 ACK报文，再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后，并没有收到对方的ACK报文，反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢？如果双方几乎在同时close一个SOCKET的话，那么就出现了双方同时发送FIN报文的情况，也即会出现CLOSING状态，表示双方都正在关闭SOCKET连接。</li> <li><code>CLOSE_WAIT</code>: 此种状态表示在等待关闭。当对方关闭一个SOCKET后发送FIN报文给自己，系统会回应一个ACK报文给对方，此时则进入到CLOSE_WAIT状态。接下来呢，察看是否还有数据发送给对方，如果没有可以 close这个SOCKET，发送FIN报文给对方，即关闭连接。所以在CLOSE_WAIT状态下，需要关闭连接。</li> <li><code>LAST_ACK</code>: 该状态是被动关闭一方在发送FIN报文后，最后等待对方的ACK报文。当收到ACK报文后，即可以进入到CLOSED可用状态。</li></ul> <p>问题：为啥主动关闭这一端，要设计一个<code>TIME_WAIT</code>状态？
确保最后一个发送的ACK（主动关闭一端的）能够顺利到达。</p> <p>其实，我们也只是了解上面的那些状态中能够被程序捕捉的，因为有的状态，转瞬即逝。</p> <h3 id="_2-1-『2msl』-maximum-segment-lifetime"><a href="#_2-1-『2msl』-maximum-segment-lifetime" class="header-anchor">#</a> 2.1.『2MSL』 (Maximum Segment Lifetime)</h3> <p>TIME_WAIT状态的存在有两个理由：</p> <ul><li>（1）让4次握手关闭流程更加可靠；4次握手的最后一个ACK是是由主动关闭方发送出去的，若这个ACK丢失，被动关闭方会再次发一个FIN过来。若主动关闭方能够保持一个2MSL的TIME_WAIT状态，则有更大的机会让丢失的ACK被再次发送出去。</li> <li>（2）防止lost duplicate对后续新建正常链接的传输造成破坏。lost uplicate在实际的网络中非常常见，经常是由于路由器产生故障，路径无法收敛，导致一个packet在路由器A，B，C之间做类似死循环的跳转。IP头部有个TTL，限制了一个包在网络中的最大跳数，因此这个包有两种命运，要么最后TTL变为0，在网络中消失；要么TTL在变为0之前路由器路径收敛，它凭借剩余的TTL跳数终于到达目的地。但非常可惜的是TCP通过超时重传机制在早些时候发送了一个跟它一模一样的包，并先于它达到了目的地，因此它的命运也就注定被TCP协议栈抛弃。</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/temp02.png" alt="temp02"></p> <blockquote><p>2MSL的缺点和解决</p></blockquote> <ul><li>缺点：要等2MSL才能释放我用的那个端口号。<br>
虽说不错，但是如果重启，这样维护需要2MSL，但是不方便。</li> <li>解决方案：那个2MSL需要等1分钟，你继续等待1分钟，但是我们的端口允许我们重复使用。</li> <li>端口复用</li></ul> <h3 id="_2-2-半关闭"><a href="#_2-2-半关闭" class="header-anchor">#</a> 2.2.半关闭</h3> <p>RST指的是（标志位，和SYN啥的是对等的，实际上不太会用到，<strong>『RST表示reset』</strong>）</p> <p>从程序的角度，可以使用API来控制实现半连接状态。</p> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;sys/socket.h&gt;</span></span>
<span class="token keyword">int</span> <span class="token function">shutdown</span><span class="token punctuation">(</span><span class="token keyword">int</span> sockfd<span class="token punctuation">,</span> <span class="token keyword">int</span> how<span class="token punctuation">)</span><span class="token punctuation">;</span>
sockfd<span class="token operator">:</span> 需要关闭的socket的描述符
how<span class="token operator">:</span>	允许为shutdown操作选择以下几种方式<span class="token operator">:</span>
	<span class="token function">SHUT_RD</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>：	关闭sockfd上的读功能，此选项将不允许sockfd进行读操作。
					该套接字不再接受数据，任何当前在套接字接受缓冲区的数据将被无声的丢弃掉。
	<span class="token function">SHUT_WR</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token operator">:</span>		关闭sockfd的写功能，此选项将不允许sockfd进行写操作。进程不能在对此套接字发出写操作。
	<span class="token function">SHUT_RDWR</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token operator">:</span>	关闭sockfd的读写功能。相当于调用shutdown两次：首先是以SHUT_RD<span class="token punctuation">,</span>然后以SHUT_WR。
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><h2 id="_3-网络套接字相关函数『记忆』"><a href="#_3-网络套接字相关函数『记忆』" class="header-anchor">#</a> 3.网络套接字相关函数『记忆』</h2> <p>借助套接字完成TCP下的C/S模型</p> <h3 id="_3-1-字节序和主机字节序的转换"><a href="#_3-1-字节序和主机字节序的转换" class="header-anchor">#</a> 3.1.字节序和主机字节序的转换</h3> <p>TCP/IP协议规定，网络数据流应采用<strong>大端字节序</strong>，即低地址高字节</p> <blockquote><ul><li>原因，因为TCP/IP最早诞生的时候，几乎是和Unix一块诞生的</li> <li>那个年代，数据存储主要是IBM公司来做，那那时候，他们选用的存储方式都是大端存储法。</li> <li>现在IBM的好多大型机，还是采用的大端法</li> <li>后来，小端法，实际上是在Windows才有的。Intel架构的时候</li> <li>后来在Intel架构上几乎都是用的小端法、</li></ul></blockquote> <p>为使网络程序具有可移植性，使同样的C代码在大端和小端计算机上编译后都能正常运行，可以调用以下库函数做网络字节序和主机字节序的转换。</p> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;arpa/inet.h&gt;</span></span>
<span class="token class-name">uint32_t</span> <span class="token function">htonl</span><span class="token punctuation">(</span><span class="token class-name">uint32_t</span> hostlong<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">uint16_t</span> <span class="token function">htons</span><span class="token punctuation">(</span><span class="token class-name">uint16_t</span> hostshort<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">uint32_t</span> <span class="token function">ntohl</span><span class="token punctuation">(</span><span class="token class-name">uint32_t</span> netlong<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">uint16_t</span> <span class="token function">ntohs</span><span class="token punctuation">(</span><span class="token class-name">uint16_t</span> netshort<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>h表示host，n表示network，l表示32位长整数，s表示16位短整数。
32位的显然是IP，16位的是端口号。
如果主机是小端字节序，这些函数将参数做相应的大小端转换然后返回，如果主机是大端字节序，这些函数不做转换，将参数原封不动地返回。</p> <h3 id="_3-3-sockaddr数据结构"><a href="#_3-3-sockaddr数据结构" class="header-anchor">#</a> 3.3.sockaddr数据结构</h3> <p>strcut sockaddr <strong>很多网络编程函数诞生早于IPv4协议（强调，理解bind等）</strong>
那时候都使用的是sockaddr结构体,为了向前兼容，现在sockaddr退化成了（void *）的作用
传递一个地址给函数，至于这个函数是sockaddr_in还是sockaddr_in6，由地址族确定
然后函数内部再强制类型转化为所需的地址类型。</p> <blockquote><ul><li>由于，在其中，把结构体sockaddr改为了sockaddr_in结构体，导致编程的时候变麻烦了、</li> <li>特别是这3个函数，他们需要的是sockaddr</li> <li>struct sockaddr_in addr;(定义的时候，要这么定义，原因：sockaddr已经被废弃了，不能用了)</li> <li>bind(,(struct sockaddr*)&amp;addr );</li> <li>accept()</li> <li>connect()</li></ul></blockquote> <p><font style="background:yellow;">我们现在讲的套接字默认指的是<strong>网络套接字</strong>。注意，我们进程通信的是<strong>本地套接字</strong>，所谓本地套接字就是不使用网络结构呗，不使用IP地址，但是端口号还是得用</font></p> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/temp01.png" alt="temp01"></p> <p><font style="background:yellow;">上图可能疑惑点：为什么客户端没有bind呢？难度不需要绑定吗？原因：其实，你如皋没有调用，那么你的操作系统会给你<strong>自动分配</strong>一个端口号和IP地址。</font></p> <p>服务器端，肯定不能自动分配：如果这样，那我的客户端，上<strong>哪里绑定</strong>去2333
其实，客户端也可以bind，但是，我们不绑定的话，我们可以看做（隐式绑定）</p> <p>要想通过socket完成通信，显然我们必须要创建套接字。</p> <h2 id="_4-tcp的两份代码（要倒背如流）"><a href="#_4-tcp的两份代码（要倒背如流）" class="header-anchor">#</a> 4.TCP的两份代码（要倒背如流）</h2> <h3 id="_4-1-只写了服务器端，如何测试？nc"><a href="#_4-1-只写了服务器端，如何测试？nc" class="header-anchor">#</a> 4.1.只写了服务器端，如何测试？nc</h3> <p>问题来了，如果只写了服务器端，如何测试？</p> <p>命令</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token function">nc</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>nc还有人读脑残。（net connect）</p> <p>nc加上你要连接的目标IP的地址，比如说我们本机的127.0.0.1   再加上端口号</p> <p>比如上面的程序，我们可以测试</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token function">nc</span> <span class="token number">127.0</span>.0.1 <span class="token number">6666</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>这样就可以进行</p> <p>客户端和服务器启动后可以使用netstat命令查看链接情况：
netstat -apn|grep 6666</p> <p>ARP攻击：针对你当前某一个IP地址，不断的给你发送数据包。
那就当你当前网卡里面读取数据的那个进程给拥塞住。</p> <h2 id="_4-错误处理函数"><a href="#_4-错误处理函数" class="header-anchor">#</a> 4.错误处理函数</h2> <ul><li><p><strong>错误处理函数（让网络编程程序更加健壮）（错误封装，这种思想很重要</strong>）</p></li> <li><p>为使错误处理的代码不影响主程序的可读性，我们把与socket相关的一些系统函数加上错误处理代码包装成新的函数，做成一个<strong>模块</strong>wrap.c：</p></li> <li><p><font style="background:yellow;">（也就是将我们要用到的函数重新进行封装一下，比如说listen啥的）(很好的。可以和主控程序联合编译，方式：你在程序当中要使用的所有系统调用，你都把它重命名一下，函数参数，返回值啥的都不变）</font></p></li> <li><p>模块：.c和.h</p></li></ul> <h2 id="_5-『tcp3次握手和4次挥手』"><a href="#_5-『tcp3次握手和4次挥手』" class="header-anchor">#</a> 5.『TCP3次握手和4次挥手』</h2> <ul><li>传输层：
1）对不稳定的网络层，完全不弥补——能不能接受到，无所谓——UDP，无连接的 『不可靠**报文（因为有去无回，所以叫报）<strong>传输（有去无回的，我们认为这个数据传输方向是单向的） 』
2）对不稳定的网络层，做完全弥补。对我们每发的数据包进行记录，发现没有接收到，重发——TCP
面向连接的可靠</strong>数据包（难怪叫包）**传递</li></ul> <h3 id="_2-4次挥手（原因）"><a href="#_2-4次挥手（原因）" class="header-anchor">#</a> 2.4次挥手（原因）</h3> <p>Linux操作系统中，我允许，建立连接的双方有一端关闭连接，但是另一端不关闭。（这种状态，称为<strong>半关闭</strong>）</p> <p>场景：你那边申请结束，我虽然同意，但是我还有部分数据没有传输完，所以，我待会再和你申请，我这边的结束</p> <ul><li>疑惑：</li></ul> <blockquote><ul><li>IP层， 我所能容纳的上限是65535（也就是16bit）（他所能容纳的数据上限是16位数，这个65535是指你网络层，如果我单独把他拎出来，单独看他，他所能够携带的数据上限是65535这么多，但是我们知道，你在网络中传输，你不能单独用IP进行传输，脱离了应用层，传输层，链路层，你根本无法传输到外面，额，这些概念真是坑）</li> <li>以太网，所能容纳的上限是1500
两者的关系，这就涉及到数据包在各个路由器的</li></ul></blockquote> <p>虽然，IP这层设计的时候是有65535那么大，但是他会收到传输层和链路层的夹板，导致我这一个数据包，能不能带这么大的数据？？
不能。比如，他们都比我小，我就要迁就一下他们**（难道，是几个协议封装，像板子，弄成筒子，短板效应？？对的，这个理解很好）**</p> <p>同理，所以最后受到限制的就是以太网（链路层？？），他默认就能传，1500
所以，虽然你IP层可以那么大，但是由于“木桶效应”，所以不能那么大。</p> <p>其实，我们的以太网的数据包的大小，1500是符合我们日常的
我们经常只是几KB的，所以说，1，2个数据包就过去了。
所以，也没有必要把这个设计很大。</p> <p>TCP还是会丢包，只是丢包，可以重传。
UDP的话，丢包了就丢包了。</p> <h3 id="_3mtu（最大传输单元）"><a href="#_3mtu（最大传输单元）" class="header-anchor">#</a> 3MTU（最大传输单元）</h3> <ul><li>通信术语： <strong>最大传输单元</strong>（Maximum Transmission Unit，MTU）</li></ul> <p>是指一种通信协议的某一层上面所能通过的最大数据包大小（以字节为单位）。最大传输单元这个参数通常与通信接口有关（网络接口卡、串口等）。从上面的MTU，我们引出了——<strong>最大传输大小mss</strong></p> <h3 id="_4滑动窗口"><a href="#_4滑动窗口" class="header-anchor">#</a> 4滑动窗口</h3> <ul><li>(TCP流量控制)</li></ul> <p>介绍UDP时我们描述了这样的问题：如果发送端发送的速度较快，接收端接收到数据后处理的速度较慢，而接收缓冲区的大小是固定的，就会丢失数据。</p> <p>UDP中有没有，滑动窗口这样的东西呢？因为我们知道，滑动窗口是在TCP数据包中记录的，但是UDP协议中，没有描述窗口这件事。</p> <h2 id="_6-总结"><a href="#_6-总结" class="header-anchor">#</a> 6.总结</h2> <ul><li><p>我们上面的多进程和多线程服务器,能不能直接用他来支持高并发啊？
比如开个网站</p></li> <li><p>**实际上是不行的！因为开销太大。**好一点的处理方式，我的服务器只有一个程序。  不应该产生这么多个.c</p></li> <li><p><strong>不需要，你来一个，我就产生一个线程或者进程去处理。我们后面有更好的处理方式！<br>
就是select活poll或者epoll</strong></p></li> <li><p>这种才是我们正儿八经去处理，高并发服务器的方法。</p></li> <li><p>那么是不是多进程或者多线程是不是没用了呢？当你连接的客户端不那么多的场景，你就可以使用多线程和多进程。比如，智能家电，大概就40-50个，用多进程就好，要是还有省一点，我用多线程。几十，几百还是可以，多进程或者多线程还是可以满足的，比如，有的Linux线程能起5百多，1千多啥的。</p></li></ul> <h2 id="参考资料"><a href="#参考资料" class="header-anchor">#</a> 参考资料</h2> <ul><li>张小方Blog，<a href="http://balloonwj.gitee.io/cpp-guide-web/" target="_blank" rel="noopener noreferrer">高性能服务器开发<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li></ul></div> <div class="page-edit"><!----> <!----></div> <!----> </div> <!----></div></div>
    <script src="/assets/js/app.c70e21ad.js" defer></script><script src="/assets/js/81.02670d10.js" defer></script>
  </body>
</html>
